<?php

class ArticlesController extends AppController {

    var $name = 'Articles';
    var $uses = array('Article', 'Purchase', 'Supplier'); //aca le decis cuales modelos vas a usar
    var $helpers = array('Html', 'Form', 'Javascript');

    function beforeFilter() {
        parent::beforeFilter();

        //si no es un usuario con nivel = 2 o 1 no lo dejo acceder a las siguientes funciones de este controlador
        if (in_array($this->action, array('index', 'add', 'edit', 'delete', 'view', 'baja', 'down', 'imagen')) and $this->Auth->user('id') and !(in_array($this->Auth->user('level'), array(1,2)))) {
            $this->redirect(array('user' => false, 'controller' => 'articles', 'action' => 'inicio'));
        }
        if (in_array($this->action, array('agregar')) and $this->Auth->user('id')) {
            $this->redirect(array('user' => false, 'controller' => 'articles', 'action' => 'inicio'));
        }
    }
    
    function inicio() {//portada inicial vacia
        $this->Article->recursive = 0;
        $condicion = array('Article.termination_date is NULL');
        $articles = $this->paginate($condicion); //Anda pero arroja 0 resultados.
        $this->set('articles', $articles);
    }

    function index() {
        $this->Article->recursive = 0;

        //si vienen filtros aplicados
        if (!empty($this->data)) {

            $datos = $this->data['Article'];
            $filtro = ' Article.termination_date is NULL ';

            if (isset($datos['marca']) && trim($datos['marca']) != '') {
                $filtro .= ' AND Article.mark like "%' . $datos['marca'] . '%"';
            }
            if (isset($datos['modelo']) && trim($datos['modelo']) != '') {
                $filtro .= ' AND Article.model like "%' . $datos['modelo'] . '%"';
            }
            //aca seguis agregando los filtros que quieras

            $this->paginate['order'] = array('Article.mark' => 'ASC');
            $resultados = $this->paginate('Article', array($filtro));

            $this->set('articles', $resultados);

            //guardo el filtro usado en session para despues recordarlo con el paginate
            $restricciones = array('filter' => $filtro, 'order' => $this->paginate['order']);
            $this->Session->write('search_conditions_articles', $restricciones);
        } elseif ($this->Session->check('search_conditions_articles')) {

            //si habia algun filtro guardado en session lo tengo que tomar y seguir aplicando el mismo
            //si estoy paginando
            if (isset($this->params['named']['limit']) || isset($this->params['named']['page'])) {
                $restricciones = $this->Session->read('search_conditions_articles');

                //si esta acomodando por algun campo en particular
                if (isset($this->params['named']['sort'])) {
                    $this->paginate['order'] = array($this->params['named']['sort'] => $this->params['named']['sort']['direction']);
                } else {
                    //sino sigo aplicando el mismo que ya venia
                    $this->paginate['order'] = $restricciones['order'];
                }
                //si hay que seguir el filtro de empleados
                $resultados = $this->paginate('Article', array($restricciones['filter']));

                $this->set('articles', $resultados);
            } else {
                //lo borro de la session
                $filtro = ' Article.termination_date is NULL ';
                $this->Session->delete('search_conditions_articles');
                $this->paginate['order'] = array('Article.mark' => 'ASC');
                $resultados = $this->paginate('Article', array($filtro));
                $this->set('articles', $resultados);
            }
        } else {

            //le pongo un filtro por default
            $filtro = ' Article.termination_date is NULL ';
            $this->paginate['order'] = array('Article.mark' => 'ASC');
            $resultados = $this->paginate('Article', array($filtro));
            $this->set('articles', $resultados);
        }

    }
    
    function pedidos(){
        //C:\xampp\htdocs\cerrajeria\app\vendors
        require('/app/vendors/fpdf/fpdf.php');

        $pdf = new FPDF();
        $pdf->AddPage();
        $pdf->SetFont('Arial','B',16);
        $pdf->SetMargins(1,1.5,1.5);
//        $pdf->Cell(40,10,'¡Hola, Mundo!',30);
        
        $articles = $this->Article->query("SELECT mark, model, amount_available FROM `articles` WHERE articles.amount_available <= articles.min");
//        pr($articles);die;
        $pdf->Image(SITE_URL . '/img/pdf_logo.JPG', 170, 5, 30);
        $pdf->Text(10,15,'Lista de Pedidos');
        // Salto de línea
        $pdf->Ln(10);
        $pdf->Line(10, 20, 200, 20);
//        $pdf->MultiCell(60,10,' string txt ', 1,'R',false);
        
        $pdf->SetFont('Arial','B',12);
        $pdf->SetXY(20, 40);
        $pdf->Cell(140, 5, 'MARCA', 1, 'C', 1);
        $pdf->SetXY(80, 40);
        $pdf->Cell(60, 5, 'MODELO', 1, 'C', 1);
        $pdf->SetXY(140, 40);
        $pdf->Cell(20, 5, 'STOCK', 1, 'C', 1);    
        $pdf->SetXY(160, 40);
        $pdf->Cell(30, 5, 'PEDIR', 1, 'C', 1);     
        $y = 50;
        $pdf->SetFillColor(255, 255, 255);
        $pdf->SetFont('Arial','',11);
//        pr($articles[$i]['articles']['mark']);die;
        foreach($articles as $art){
            $pdf->SetXY(20, $y);
            $pdf->MultiCell(140, 5, $art['articles']['mark'], 1, 'L', 1);    
            $pdf->SetXY(80, $y);
            $pdf->MultiCell(60, 5, $art['articles']['model'], 1, 'L', 1);
            $pdf->SetXY(140, $y);
            $pdf->MultiCell(20, 5, $art['articles']['amount_available'], 1, 'R', 1);        
            $pdf->SetXY(160, $y);
            $pdf->MultiCell(30, 5, '', 1, 'R', 1);
            $y +=+5;

            if ($y > 280){
                $pdf->AddPage();
                $pdf->SetFont('Arial','B',12);
                $pdf->SetXY(20, 40);
                $pdf->Cell(140, 5, 'MARCA', 1, 'C', 1);
                $pdf->SetXY(80, 40);
                $pdf->Cell(60, 5, 'MODELO', 1, 'C', 1);
                $pdf->SetXY(140, 40);
                $pdf->Cell(20, 5, 'STOCK', 1, 'C', 1);    
                $pdf->SetXY(160, 40);
                $pdf->Cell(30, 5, 'PEDIR', 1, 'C', 1);     
                $y = 50;
                $pdf->SetFillColor(255, 255, 255);
                $pdf->SetFont('Arial','',11);
            }
        }

        $pdf->Text(10,275,"Fecha: ".date("d/m/Y")."\n\n");
        $pdf->Text(10,280,"Hora: ".date("H:i:s")."\n\n");
        $pdf->Output();

    }

    function down() {//Articulos dados de baja
        $this->Article->recursive = 0;
//        pr($this->paginate());die;
        $condicion = array('Article.termination_date is NOT NULL');
        $this->paginate['order'] = array('Article.mark' => 'ASC');
        $articles = $this->paginate($condicion); //Anda pero arroja 0 resultados.
//        pr($articles);die;
        $this->set('articles', $articles);
    }

    function view($id = null) {
        if (!$id) {
            $this->Session->setFlash(__('Artículo no válido', true));
            $this->redirect(array('action' => 'index'));
        }
        $this->set('article', $this->Article->read(null, $id));
    }

    function add() {
        //empiezo una transaccion
        $this->Article->query('SET AUTOCOMMIT = 0;');
        $this->Article->query('START TRANSACTION;');
        $bandera = true; //la uso para ver si algo salio mal

        if (!empty($this->data)) {

            $datos = $this->data['Article']; // te falto esto

            $this->Article->create();
            if ($this->Article->save($this->data)) {

                $article_id = $this->Article->id; //despues de un save, asi obtenes el id del registro que guardarste
                //Redimensionar Imagen
                //Path donde se van a alojar las imagenes es IMG_ARTICLE_PATH
                $estructura = IMG_ARTICLE_PATH . DS . $article_id;
                mkdir($estructura, 777, false);
                //ahora tengo que guardar la imagen redimensionada y tomando los datos del crop
//                pr($datos);
//                die;

                $data1 = array();
                $data1['origen'] = $datos['origen1'];
                $data1['x'] = $datos['x1'];
                $data1['y'] = $datos['y1'];
                $data1['w'] = $datos['w1'];
                $data1['h'] = $datos['h1'];
                $data1['name'] = $datos['mark'] . '-' . $datos['model']; //este es el nombre con el que se va a guardar la imagen
//                pr($data1);
//                die;
                if ($data1['origen'] != NULL) {
                    $nombre_imagen1 = $this->__upload_trim_image($data1, $article_id); //aca habias dejado combat_id
                } else {
                    $nombre_imagen1 = NULL;
                }
                //y no habias agregado la funcion en el app_controler
                //y tampoco aca abajo
                //ahora actualizo los campos image porque lo habia guardado sin nada
                $array_guardar = array();
                $array_guardar['id'] = $article_id;
                $array_guardar['image'] = $nombre_imagen1;
                if($this->Article->save($array_guardar)){
                    //                        Insercion tabla purchases
                    $array_datos = array();
                    $array_datos['article_id'] = $article_id;
                    $array_datos['purchase_date'] = date('Y-m-d H:i:s');
                    $array_datos['purchase_amount'] = $this->data['Article']['amount_available'];
                    $array_datos['supplier_id'] = $this->data['Article']['supplier_id'];

                    $this->Purchase->create();
                    if ($this->Purchase->save($array_datos)) {
    //                    echo "Setea bandera true"; die;
                        $bandera = true;
                    } else {
                        $bandera = false;
                    }
    //                        FIN Insercion tabla purchases
                }else{
                    $bandera = false;
                }

                //Fin Redimensionar Imagen
            } else {
                $bandera = false;
            }

            if ($bandera) {
                $this->Article->query('COMMIT;');
                $this->Article->query('SET AUTOCOMMIT = 1;');
                $this->redirect(array('action' => 'index'));
            } else {//si hubo algun error hago un ROLLBACK deshaciendo todas estas consultas
                $this->Article->query('ROLLBACK;');
                $this->Article->query('SET AUTOCOMMIT = 1;');
                $this->Session->setFlash(__('El artículo no se pudo guardar. Por favor, inténtelo de nuevo.', true));
            }
        }

        $types = $this->Article->Type->find('list', array('conditions' => array('Type.termination_date' => NULL)));
        $suppliers = $this->Supplier->find('list', array('conditions' => array('Supplier.termination_date' => NULL)));
        $this->set(compact('types', 'suppliers'));
    }

    function edit($id = null) {
        if (!$id && empty($this->data)) {
            $this->Session->setFlash(__('Artículo no válido', true));
            $this->redirect(array('action' => 'index'));
        }
        if (!empty($this->data)) {

//            $this->data['Article']['image'] = NULL; //Reseteo la imagen para q se pueda cargar una nueva
            $datos = $this->data['Article']; // te falto esto

            if ($this->Article->save($this->data)) {
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('El artículo no se pudo guardar. Por favor, inténtelo de nuevo.', true));
            }
        }
        if (empty($this->data)) {
            $this->data = $this->Article->read(null, $id);
        }
        $types = $this->Article->Type->find('list', array('conditions' => array('Type.termination_date' => NULL)));
        $this->set(compact('types'));
    }
    
    function imagen($id = null) {
        if (!$id && empty($this->data)) {
            $this->Session->setFlash(__('Artículo no válido', true));
            $this->redirect(array('action' => 'index'));
        }
        if (!empty($this->data)) {

            $this->data['Article']['image'] = NULL; //Reseteo la imagen para q se pueda cargar una nueva
            $datos = $this->data['Article'];

            if ($this->Article->save($this->data)) {

                $article_id = $this->Article->id; //despues de un save, asi obtenes el id del registro que guardarste
                //Redimensionar Imagen
                //Path donde se van a alojar las imagenes es IMG_ARTICLE_PATH
                $estructura = IMG_ARTICLE_PATH . DS . $article_id;
                //ahora tengo que guardar la imagen redimensionada y tomando los datos del crop

                $data1 = array();
                $data1['origen'] = $datos['origen1'];
                $data1['x'] = $datos['x1'];
                $data1['y'] = $datos['y1'];
                $data1['w'] = $datos['w1'];
                $data1['h'] = $datos['h1'];
                $data1['name'] = $datos['mark'] . '-' . $datos['model']; //este es el nombre con el que se va a guardar la imagen

                if ($data1['origen'] != NULL) {
                    $nombre_imagen1 = $this->__upload_trim_image($data1, $article_id); //aca habias dejado combat_id
                } else {
                    $nombre_imagen1 = NULL;
                }
                //y no habias agregado la funcion en el app_controler
                //y tampoco aca abajo
                //ahora actualizo los campos image porque lo habia guardado sin nada
                $array_guardar = array();
                $array_guardar['id'] = $article_id;
                $array_guardar['image'] = $nombre_imagen1;
                $this->Article->save($array_guardar);

                //Fin Redimensionar Imagen                
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('El artículo no se pudo guardar. Por favor, inténtelo de nuevo.', true));
            }
        }
        if (empty($this->data)) {
            $this->data = $this->Article->read(null, $id);
        }
    }

//    function agregar($id = null) {
//        //empiezo una transaccion
//        $this->Article->query('SET AUTOCOMMIT = 0;');
//        $this->Article->query('START TRANSACTION;');
//        $bandera = true; //la uso para ver si algo salio mal
//
//        if (!$id && empty($this->data)) {
//            $this->Session->setFlash(__('Artículo no válido', true));
//            $this->redirect(array('action' => 'index'));
//        }
//        if (!empty($this->data)) {
//
//            $aux = $this->Article->find('first', array('conditions' => array('Article.id' => $this->data['Article']['id'])));
//            $aux['Article']['amount_available'] = $aux['Article']['amount_available'] + $this->data['Article']['cantidad'];
//            if ($this->Article->save($aux)) {
//                //$this->Session->setFlash(__('The article has been saved', true));
//                //$this->redirect(array('action' => 'index'));
////                        Insercion tabla purchases
//                $array_datos = array();
//                $array_datos['article_id'] = $aux['Article']['id'];
//                $array_datos['purchase_date'] = $this->data['Article']['fecha'];
//                $array_datos['purchase_amount'] = $this->data['Article']['cantidad'];
//                $array_datos['supplier_id'] = $this->data['Article']['supplier_id'];
//
//                list($d, $m, $a) = explode("/", $array_datos['purchase_date']);
//                $fecha_aux = $a . "-" . $m . "-" . $d;
//                $array_datos['purchase_date'] = $fecha_aux;
//
//                $this->Purchase->create();
//                if ($this->Purchase->save($array_datos)) {
////                    echo "Setea bandera true"; die;
//                    $bandera = true;
//                } else {
//                    $bandera = false;
//                }
////                        FIN Insercion tabla purchases
//            } else {
//                $bandera = false;
//            }
//
//            if ($bandera) {
//                $this->Article->query('COMMIT;');
//                $this->Article->query('SET AUTOCOMMIT = 1;');
//                $this->redirect(array('action' => 'index'));
//            } else {//si hubo algun error hago un ROLLBACK deshaciendo todas estas consultas
//                $this->Article->query('ROLLBACK;');
//                $this->Article->query('SET AUTOCOMMIT = 1;');
//                $this->Session->setFlash(__('El artículo no se pudo guardar. Por favor, inténtelo de nuevo.', true));
//            }
//        }
////        if (empty($this->data)) {
////            $this->data = $this->Article->read(null, $id);
////            //transformo la fecha para que se muestre con el formato dd/mm/yyyy
////            $this->data['Purchase']['purchase_date'] = date('d/m/Y', strtotime($this->data['Purchase']['purchase_date']));
////        }
//        //Seleccionar el ultimo proveedor utilizado para futuras compras como defecto
//
//        $ultimo_proveedor = $this->Article->query("SELECT suppliers.id as id FROM suppliers, purchases, articles WHERE suppliers.id = purchases.supplier_id AND purchases.article_id = " . $id . " order by purchases.purchase_date desc LIMIT 1");
//        $this->set('ultimo_proveedor', $ultimo_proveedor);
//        $aux2 = $this->Article->find('first', array('conditions' => array('Article.id' => $id)));
//        $marca = $aux2['Article']['mark'];
//        $this->set('marca', $marca);
//        $modelo = $aux2['Article']['model'];
//        $this->set('modelo', $modelo);
////        pr($ultimo_proveedor);die;
//        //Fin Ultimo Proveedor
//
//        $suppliers = $this->Supplier->find('list', array('conditions' => array('Supplier.termination_date' => NULL)));
//        $this->set(compact('suppliers'));
//
//        $this->set('valor_id', $id);
//    }

    function baja($id = null) {
        if (!$id && empty($this->data)) {
            $this->Session->setFlash(__('Artículo no válido', true));
            $this->redirect(array('action' => 'index'));
        }
        if (!empty($this->data)) {

            //ahora vamos a cambiar el formato de la fecha
            //me pongo a armar los campos de las fechas
            $array_datos = $this->data;

            list($d, $m, $a) = explode("/", $array_datos['Article']['termination_date']);
            $fecha_aux = $a . "-" . $m . "-" . $d;
            $array_datos['Article']['termination_date'] = $fecha_aux;

            if ($this->Article->save($array_datos)) {
//                $this->Session->setFlash(__('El artículo ha sido guardado', true));
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('El artículo no se pudo guardar. Por favor, inténtelo de nuevo.', true));
            }
        }
        if (empty($this->data)) {
            $this->data = $this->Article->read(null, $id);
        }
        $types = $this->Article->Type->find('list');
        $this->set(compact('types'));
    }

    function deshacer_baja($id = null) {
        if (!$id) {
            $this->Session->setFlash(__('No válida de identificación para el artículo', true));
            $this->redirect(array('action' => 'down'));
        }

//        $aux = $this->Article->find('first', array('conditions' => array('Article.id' => $this->data['Article']['id'])));
        $aux = $this->Article->find('first', array('conditions' => array('Article.id' => $id)));
        $aux['Article']['termination_date'] = NULL;

        if ($this->Article->save($aux)) {
            $this->Session->setFlash(__('El articulo se encuentra activo ahora', true));
            $this->redirect(array('action' => 'index'));

//        $this->data = $this->Article->read(null, $id);
        }
        $types = $this->Article->Type->find('list');
        $this->set(compact('types'));
//
        $this->set('valor_id', $id);
    }

    function delete($id = null) {
        //empiezo una transaccion
        $this->Article->query('SET AUTOCOMMIT = 0;');
        $this->Article->query('START TRANSACTION;');
        $bandera = true; //la uso para ver si algo salio mal

        $items = $this->Article->query("SELECT COUNT(*) as cantidad2 FROM items WHERE items.article_id = " . $id . ";");
//        pr($items[0][0]['cantidad2']);die;
        if ($items[0][0]['cantidad2'] == 0) {
            //Verifico q no tenga pedidos
            $orders = $this->Article->query("SELECT COUNT(*) as cantidad2 FROM orders WHERE orders.article_id = " . $id . ";");
            if ($orders[0][0]['cantidad2'] == 0){
                if (!$id) {
                    $this->Session->setFlash(__('No válida de identificación para el artículo', true));
                    $this->redirect(array('action' => 'index'));
                }
                if ($this->Purchase->deleteAll(array('Purchase.article_id' => $id))) {
                    if ($this->Article->delete($id)) {
                        //                $this->Session->setFlash(__('Artículo borrado', true));
                        //                $this->redirect(array('action' => 'index'));
                        $bandera = true;
                    } else {
                        $bandera = false;
                    }
                } else {
                    $bandera = false;
                }
    //            $this->Session->setFlash(__('El artículo no se ha eliminado', true));
    //            $this->redirect(array('action' => 'index'));
                if ($bandera) {
                    $this->Article->query('COMMIT;');
                    $this->Article->query('SET AUTOCOMMIT = 1;');
                    $this->redirect(array('action' => 'index'));
    //                $this->Session->setFlash(__('Artículo borrado', true));
                } else {//si hubo algun error hago un ROLLBACK deshaciendo todas estas consultas
                    $this->Article->query('ROLLBACK;');
                    $this->Article->query('SET AUTOCOMMIT = 1;');
                    $this->Session->setFlash(__('El artículo no se ha eliminado', true));
                }
            }else{
                $this->Session->setFlash(__('No se puede eliminar porque esta asociado con algun pedido.', true));
                $this->redirect(array('action' => 'index'));
            }
        } else {
            $this->Session->setFlash(__('No se puede eliminar porque esta asociado con algun items.', true));
            $this->redirect(array('action' => 'index'));
        }
    }

    function __upload_trim_image($datos, $article_id) {

        $datos['origen'] = trim($datos['origen']);

        //obtengo la extension del archivo a subir
        $aux = explode('.', $datos['origen']);
        $extension = strtolower(trim($aux[count($aux) - 1]));
		

        //armo el nombre de la imagen
        $nombre_imagen = $this->__str_safe($datos['name']);
        $nombre = $nombre_imagen . '.' . $extension;
        //$nombre = $nombre_imagen.'.'.$extension;
        //armo la imagen redimensionada a 150 x 100 px
        //primero la copio a un lugar temporal asi con el tamaño que se cropeo
        $destino = IMG_ARTICLE_PATH . DS . $article_id . DS . $nombre;

        //creo una imagen con el tamaño del thumb
        //$auxiliar = imagecreatetruecolor(150,100);
        $auxiliar = imagecreatetruecolor(285, 285);

        //segun el tipo de extension que tenga voy a operar
        if ($extension == 'jpeg' || $extension == 'jpg') {
            //creo una imagen nueva leyendo desde el origen
            $im = @imagecreatefromjpeg(SITE_PATH . DS . 'app' . DS . 'webroot' . $datos['origen']);
            //ahora agarro esta imagen y copio solo la parte que me interesa, o sea aquella que arranca de x, y con un ancho y alto de w, h
            //a esta misma la redimensiono a un tamaño de 150 x 100 y le digo que la ponga en la coordenada 0,0 de la nueva imagen que es $auxiliar
            imagecopyresized($auxiliar, $im, 0, 0, $datos['x'], $datos['y'], 285, 285, $datos['w'], $datos['h']);
            //ahora toma esta imagen que tengo en $auxiliar y la tiro a un archivo con el nombre correspondiente
            imagejpeg($auxiliar, $destino, 100);
        } elseif ($extension == 'png') {
            $im = @imagecreatefrompng(SITE_PATH . DS . 'app' . DS . 'webroot' . $datos['origen']);
            imagecopyresized($auxiliar, $im, 0, 0, $datos['x'], $datos['y'], 285, 285, $datos['w'], $datos['h']);
//            imagecopyresized($auxiliar, $im, 0, 0, $datos['x'], $datos['y'], 150,  100, $datos['w'], $datos['h']);
            imagepng($auxiliar, $destino, 9);
        } elseif ($extension == 'gif') {
            $im = @imagecreatefromgif(SITE_PATH . DS . 'app' . DS . 'webroot' . $datos['origen']);
            imagecopyresized($auxiliar, $im, 0, 0, $datos['x'], $datos['y'], 285, 285, $datos['w'], $datos['h']);
            imagegif($auxiliar, $destino);
        }

        //le doy permisos a este archivo
        chmod($destino, 0777);

        //ahora borro la imagen que utilice para crear la nueva chiquita
        unlink(SITE_PATH . DS . 'app' . DS . 'webroot' . $datos['origen']);

        //devuelvo el nombre de la imagen con su extension
        return $nombre;
    }

    /**
     * Esta funcion es llamada por un ajax, devuelve el precio y la cantidad disponible de un articulo
     * en formato json
     */
    function get_price() {

        //tomo la informacion que me llega en la variable $_POST
        $item_id = $_POST['id'];

        $this->Article->recursive = -1;
        $res = $this->Article->find('first', array('conditions' => array('Article.id' => $item_id)));

        //imprimo el resultado
        $price = $res['Article']['price'];
        $stock = $res['Article']['amount_available'];
        
        echo json_encode(array('price'=>$price, 'stock'=>$stock));
        //lo mato para que no me haga un render de la vista get_price  (que no existe)
        die;
    }

}
